require(File.dirname(__FILE__)+'/helpers_tests.rb')

class StatsampleAnovaOneWayWithVectorsTestCase < MiniTest::Unit::TestCase
  context(Statsample::Anova::OneWayWithVectors) do
    context("when initializing") do
      setup do
        @v1=10.times.map {rand(100)}.to_scale
        @v2=10.times.map {rand(100)}.to_scale
        @v3=10.times.map {rand(100)}.to_scale
      end
      should "be the same using [] or args*" do
        a1=Statsample::Anova::OneWayWithVectors.new(@v1,@v2,@v3)
        a2=Statsample::Anova::OneWayWithVectors.new([@v1,@v2,@v3])
        assert_equal(a1.f,a2.f)
      end
      should "be the same using module method or object instantiation" do
        a1=Statsample::Anova::OneWayWithVectors.new(@v1,@v2,@v3)
        a2=Statsample::Anova.oneway_with_vectors(@v1,@v2,@v3)
        assert_equal(a1.f,a2.f)
      end
      should "detect optional hash" do
        a1=Statsample::Anova::OneWayWithVectors.new(@v1,@v2,@v3, {:name=>'aaa'})
        assert_equal('aaa', a1.name)
      end
      should "omit incorrect arguments" do
        a1=Statsample::Anova::OneWayWithVectors.new(@v1,@v2,@v3, {:name=>'aaa'})
        a2=Statsample::Anova::OneWayWithVectors.new(@v1,nil,nil,@v2,@v3, {:name=>'aaa'})
        assert_equal(a1.f,a2.f)
      end
    end
    setup do
      @v1=[3,3,2,3,6].to_vector(:scale)
      @v2=[7,6,5,6,7].to_vector(:scale)
      @v3=[9,8,9,7,8].to_vector(:scale)
      @name="Anova testing"
      @anova=Statsample::Anova::OneWayWithVectors.new(@v1,@v2,@v3, :name=>@name)
    end
    should "respond to #summary" do
      assert(@anova.respond_to? :summary)
    end
    should "have correct name of analysis on #summary" do
      assert_match(/#{@name}/, @anova.summary)
    end
    should "returns same levene values as direct Levene creation" do
      assert_equal(@anova.levene.f, Statsample::Test.levene([@v1,@v2,@v3]).f)
    end
    should "have correct value for levene" do
      assert_in_delta(0.604,@anova.levene.f, 0.001)
      assert_in_delta(0.562,@anova.levene.probability, 0.001)
    end
    should "have correct value for sst" do
     assert_in_delta(72.933, @anova.sst,0.001)
    end
    should "have correct value for sswg" do
      assert_in_delta(14.8,@anova.sswg,0.001)
    end
    should "have correct value for ssb" do
      assert_in_delta(58.133,@anova.ssbg,0.001)
    end
    should "sst=sswg+ssbg" do
      assert_in_delta(@anova.sst,@anova.sswg+@anova.ssbg,0.00001)
    end
    should "df total equal to number of n-1" do
      assert_equal(@v1.n+@v2.n+@v3.n-1,@anova.df_total)
    end
    should "df wg equal to number of n-k" do
      assert_equal(@v1.n+@v2.n+@v3.n-3,@anova.df_wg)
    end
    should "df bg equal to number of k-1" do
      assert_equal(2,@anova.df_bg)
    end
    should "f=(ssbg/df_bg)/(sswt/df_wt)" do
      assert_in_delta((@anova.ssbg.quo(@anova.df_bg)).quo( @anova.sswg.quo(@anova.df_wg)), @anova.f, 0.001)
    end
    should "p be correct" do
      assert(@anova.probability<0.01)
    end
    should "be correct using different test values" do
      anova2=Statsample::Anova::OneWayWithVectors.new([@v1,@v1,@v1,@v1,@v2])
      assert_in_delta(3.960, anova2.f,0.001)
      assert_in_delta(0.016, anova2.probability,0.001)
    end
    context "with extra information on summary" do
      setup do
        @anova.summary_descriptives=true
        @anova.summary_levene=true
        @summary=@anova.summary
      end
      should "have section with levene statistics" do
        assert_match(/Levene/, @summary)
      end
      should "have section with descriptives" do
        assert_match(/Min/, @summary)
      end
    end
  end
end
